#include <iostream>

using namespace std;
//模板
//C++提供两种模板机制:函数模板和类模板

//函数模板：建立一个通用函数，其函数返回值类型和形参类型可以不具体制定，用一个虚拟的类型来代表。
//语法：template <typename T> 函数声明或定义
//模板的目的是为了提高复用性，将类型参数化
//template--声明创建函数模板
//typename--代表其后面的符号是一种数据类型，可以用class代替
//T--通用的数据类型，名称可以替换，通常为大写字母

//交换整型数据
void swapInt(int &a, int &b) {
    int temp = a;
    a = b;
    b = temp;
}

//交换浮点型数据
void swapDouble(double &a, double &b) {
    double temp = a;
    a = b;
    b = temp;
}

//利用模板提供通用的交换函数
template<typename T>
//声明一份模板，T是一个通用的数据类型
void mySwap(T &a, T &b) {
    T temp = a;
    a = b;
    b = temp;
}

void test1() {
    int a = 10;
    int b = 20;
    cout << "a=" << a << ",b=" << b << endl;
    swapInt(a, b);
    cout << "a=" << a << ",b=" << b << endl;
    double c = 2.71;
    double d = 3.14;
    cout << "c=" << c << ",d=" << d << endl;
    swapDouble(c, d);
    cout << "c=" << c << ",d=" << d << endl;
}

void test2() {
    int a = 10;
    int b = 20;
    cout << "a=" << a << ",b=" << b << endl;
    //利用模板实现交换
    //1、自动类型推导
    mySwap(a, b);
    cout << "a=" << a << ",b=" << b << endl;
    cout << "=========" << endl;
    //2、显示指定类型
    a = 10;
    b = 20;
    cout << "a=" << a << ",b=" << b << endl;
    mySwap<int>(a, b);
    cout << "a=" << a << ",b=" << b << endl;
}

int main() {
    //test1();
    test2();
    return 0;
}